home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Educational Software Cooperative 4
/
Educational Software Cooperative 4.iso
/
mand56a
/
mandel.doc
< prev
next >
Wrap
Text File
|
1996-05-01
|
33KB
|
682 lines
Mandelbrot/Julia
Set Generator
Operating and Reference Manual
Shareware Version 5.6
Installation
The Mandelbrot/Julia Set Generator program requires an IBM compatible
computer with at least 512K of memory, a VGA display and a Microsoft
compatible mouse. The installation process is quite easy. (Users obtaining
.ZIP files from the Internet or a BBS can skip this installation process.)
First, make a backup copy of your Mandelbrot/Julia Set Generator program
disk. If necessary, consult your PC-DOS/MS-DOS manual for a description of the
Diskcopy command. Save the original program disk in a safe place and use the
copy as the working program disk.
Second, while it is possible to use the Mandelbrot/Julia Set Generator on
a floppy disk system, a hard disk system is a necessity if you wish to store a
number of image files. To install the Mandelbrot/Julia Set Generator on a hard
disk use the following steps:
1. Insert the floppy disk in your computer in drive A. (or B if necessary)
2. Type A: (or B:)
3. Type INSTALL A C
Any hard drive letters can be used, for example INSTALL B D will install
the program from floppy drive B to hard drive D. The installation will create
a directory called MAND5 on your hard drive and you will need to enter a
CD\MAND5 to change to the Mandelbrot/Julia Set Generator directory before
running the program. Once installed just type MAN to start the program. All
the files for Mandelbrot/Julia Set Generator need to be in the same directory
for the program to operate successfully.
Quick Start for Impatient New Users
Type MAN to start the program. After the mouse cursor appears click it on
the Load Image button at the left. When the window appears with the list of
image file names, simply clicking on one of them will display the image using
the current color mask. If the image file contains a specific color mask
filename it will be automatically loaded prior to displaying the image. Most
commands can be interrupted by a simple mouse click.
The zoom window feature is started by double clicking on the displayed
image. Once the zoom window appears, with its crossed center lines, it can be
moved by holding down the left mouse button, while the cursor is inside the
zoom window, and positioning the window. The zoom window size can be increased
or reduced by holding down the left mouse button and moving the mouse cursor
horizontally while it is outside the zoom window. Once correctly positioned
the mouse cursor should be clicked on the right gray panel, which will store
the changed dimensions. The zoom window can be abandoned by clicking the mouse
cursor on the left gray panel. Be careful not to drag the mouse cursor onto
the gray panels while resizing. The Set Values button should be clicked on
next, and the image file name changed. If this is not done the original image
file will be erased. Clicking on the Make Image button will start the
generation of the new zoomed image.
The Command Buttons and Their Function
Set Values
The Set Values command allows the user to set the initial parameters that
will be used by the Mandelbrot/Julia Set Generator to begin generating a new
image. These values are also available for inspection when an image has been
displayed. The values and their range are:
Item Range
-----------------------------------------------------
X center value -10 to 10
Y center value -10 to 10
Magnification >0
A value (if a Julia image) -10 to 10
B value (if a Julia image) -10 to 10
Dwell 1 to 8191
Image width in pixels 10 to 4800
Image type [M J] M or J
Full/Partial image [F P] F or P
Default color mask file xxxxxxxx.MSK
Display type [0 1] For future use
256 color palette number For future use
Image file name xxxxxxxx.MAN
or xxxxxxxx.MAR
To change a value simply click inside the rectangle where the value is
displayed and then key in a new value or file name. File name extensions must
be .MSK for color masks, .MAN for regular images and .MAR for those that are
recursive.
The A and B values are only displayed with Julia images. If the recursive
image generator is used the image width must be a member of the 2^n set, ie.
16, 32, 64, 128 etc. The program maintains the Full/Partial image status and
these values cannot be changed by the user.
Color Masks
When the Color Masks command is chosen a popup window presents the four
options:
Create/Display color mask
Select color mask
Select palette
QUIT
Clicking on the Create/Display color mask option allows the user to
create, edit and save color masks.
Clicking on the Color mask file name box allows you to type in a file
name. The file name must have the extension .MSK or you will not be able to
select it later. Ranges of dwell values should be typed into the squares on
the left. Just click on the square, type in a dwell value and <Enter>. The
colors are selected by clicking on the desired color of the color wheel in the
upper right and then clicking on the odd and even boxes at the right. The
selected color is displayed between the circular menu and the color wheel. If
the first line of the color mask reads:
0 9 [blue box] [white box]
then dwell values from 0 to 9 will be colored blue if odd and white if even.
If a solid color is desired the color boxes should be filled with the same
color. The end of a color mask should be designated with a negative value
entered into the first dwell box. The default color mask on startup is M1.MSK
and its values are:
Dwell Range Odd color Even color
-----------------------------------------------
0 9 [blue box] [white box]
10 19 [red box] [red box]
20 510 [yellow box] [yellow box]
511 511 [black box] [black box]
-1
In the case of M1.MSK, any dwell values larger than 511 will be colored
black (color 0 in the default palette).
The circular menu at upper left has four options. Clicking on the up or
down arrow jumps to the previous or next 16 color mask entries. A total of 256
entries can be placed in one color mask. The SAVE option stores the color mask
currently displayed under the name specified in the Color mask file name box.
The new color mask becomes the currently selected color mask.
Clicking on the Select color mask option presents the user with a large
window and the names of the color masks that have been stored. Clicking on a
color mask name will select and load that color mask. It then can be viewed by
selecting the Create/Display color mask option.
Clicking on the Select palette option opens a window that displays the
current VGA color palette of 16 colors. Clicking on the Default box will load
the default VGA color palette. Clicking on the arrows will select other
prestored color palettes, up to number 57.
The QUIT option returns the user to the main menu.
Make Image
Selecting the Make Image command generates a Mandelbrot or Julia image
based upon the parameters entered in the Set Values command. A warning is
issued before the generation begins to allow the user to change the file name,
as any existing file of this name will be erased.
A very simple way to generate images is first to use Load Image to display
a previously generated image. Double clicking on the image will produce a zoom
window overlaid on the display. Clicking and holding down the left mouse
button allows the zoom window to be dragged about the image to an interesting
portion of the image. The zoom window can be resized by dragging the mouse
pointer to the left and right outside the zoom window. Once the zoom window
has been positioned and sized, clicking on the gray panel at right will
automatically store the new zoomed values into the Set Values area. Be careful
not to drag the mouse cursor onto the gray panels while resizing. The user
will probably wish to enter a new image file name using the Set Values command
(this will prevent the original image file from being erased), and then
generate a new image of the area defined by the zoom window with the Make
Image command. While the zoom window is present the procedure can be cancelled
by clicking on the right gray panel around the command buttons. The zoom
window will only work on images 480 pixels wide, or less.
Load Image
The Load Image command presents the user with a list of image file names
that have been produced with the .MAN extension. Clicking on a file name will
display the image with the current color mask if the selected image has no
default color mask file name. A brief double tone is sounded if there is no
default color mask file name. If a color mask name was included when the image
was generated, this color mask will be loaded before the image is displayed.
Partially generated images will automatically continue generation when
displayed with this command. Once an image is displayed double clicking on the
image will produce a zoom window as described under the Make Image command.
Make R Image
The Make R Image command functions similarly to the Make Image command
except a recursive procedure is used in place of the normal line by line
generation. The image file should be given the .MAR extension so that it will
be properly handled when using the Load R Image command. In some cases this
recursive procedure will generate images faster that the normal method.
Partially generated images cannot be displayed with generation automatically
continuing as is the case with the normal Load Image command. Image files are
generally larger with the recursive procedure.
Load R Image
The Load R Image command displays a recursive image previously generated
with a .MAR extension in the file name. A list of such files is presented and
the selected image is clicked on. Partially generated images will not be
automatically continued as with the Load Image command.
3-D Image
The 3-D Image command displays an image generated with the Make Image
command in a pseudo 3-D style. The display algorithm is a simple one, but very
slow. VGA displays have limitations when displaying 3-D Mandelbrot images.
Best results occur with color masks that contain multiple colors and have the
dwell ranges broken into many small steps. Large values for the maximum dwell
may result in the top of the image being lost. Partially generated images will
not be automatically continued as with the Load Image command.
Plot Dwell
The Plot Dwell command reads all the dwell values of an image stored with
the .MAN extension and sums them. The sums are then plotted with the current
color mask used for each dwell value plotted. Only dwell values of 2,400 or
less will be plotted. These plots give an indication of how many points in the
image have the various dwell values and can be useful in constructing a color
mask that will display the image to best advantage.
Make PCX
The Make PCX command allows the user to select an image file stored with
the .MAN extension and create a PCX image file. A 16 color PCX file using the
default VGA color palette can be chosen or several 256 color PCX formats are
available. Click on one of the small boxes to select what type of PCX file you
desire. The color sequence of each of the 256 color formats is displayed. The
first example has magenta blending into red for dwell values from 0 to 64,
from red to yellow for dwells from 64 to 128, etc. The PCX image file format
allows users to import Mandelbrot and Julia image files into other software
such as desktop publishing programs and paint programs. PCX files can also be
used for Windows wallpaper.
Print Image
The Print Image command presents the user with nine different printer
types that are supported, or the command can be quit.
Epson 9 pin
Epson 24 pin
IBM 9 pin
IBM 24 pin
LaserJet
DeskJet 500 B/W
Epson DM Color
DeskJet 500 C
PaintJet
QUIT
The 9 pin printers will output at 120x144 dpi, the 24 pin at 180x180 dpi,
the Laserjet, Deskjet 500 B/W and Color at 150x150 dpi and the Epson DM Color
and Paintjet at 90x90 dpi. Be patient, the print drivers do take time in
exchange for attractive output. Color is the slowest. Black and white images
will be dithered. QUIT returns the user to the main menu.
The Print Image command is basically for quick hardcopy. If you wish to
print museum quality prints try a DeskJet 500 series printer. Create your
image and then make a PCX file using one of the 256 color formats. Next, load
this PCX file into the Paintbrush program that comes with Windows. This is
usually found in the Accessories window. Next print the image from Paintbrush.
You will need a 256 color display to do this and the Windows print driver that
came with the DeskJet printer. Most IBM PC's and clones being sold today come
with a 256 color display. The DeskJet will print your image with a superb
color balance at just under 100 dpi. Try an image width of about 750 pixels to
fill out the 8-1/2 inch page. I've used this method with a Hewlett-Packard
DesignJet 650C and 36 inch wide paper with images 3300 pixels wide to produce
colored output that is truly magnificent. If your printer is not supported
this method can also be used to print your images. The only thing you will
need is the Windows print driver that came with your printer.
Remember, images my be created which are much wider than your screen. The
upper left corner of your image will be the only area visible. To see the
entire image, create a 256 color PCX file and use any paint program that can
read 256 color images. These can be very attractive.
Help File
The Help File command displays the file you are currently reading.
Clicking on the arrows to the right displays the next or previous page.
Quit MAND56
The Quit MAND56 command returns the user to the DOS prompt.
Image File Structure
Each image file created by the Mandelbrot/Julia Set Generator begins with
a 150 byte header.
Byte Item Size Description
------------------------------------------------------
0 x 8 byte double x center point
8 y 8 byte double y center point
16 mag 8 byte double magnification
24 a 8 byte double a for Julia sets
32 b 8 byte double b for Julia sets
40 maxdwell unsigned int maximum dwell
42 width unsigned int image width in pixels
44 mj[2] char M/J, image type
46 partial[2] char F/P, full/partial
48 mask[32] char color mask file name
80 display integer display (not used)
82 pal integer palette (not used)
84 name[50] char signature
134 fill[16] char filler
All char strings are terminated with a hexadecimal 00 byte.
The dwell data follows the header. It should be noted that this is not a
true image file, rather the dwell values themselves are stored. This allows
users to color the image with a large variety of color masks. Storing an image
file might be simpler but for every different color mask a new image file
would have to be created.
The dwell data is stored as a series of two byte unsigned integers. Each
unsigned integer contains the dwell value and a run length corresponding to a
string of identical dwell values. The number of bits required to hold the
maximum dwell is first obtained. If the maximum dwell is 511, then 9 bits are
required, 1023 would require 10 bits, etc. Using 1023 for the maximum dwell as
an example, the right most 10 bits of the 16 bit integer represents the dwell
value and the 6 left most bits contain the run length. As a run length of zero
is not very useful, this value is always incremented by one such that a run
length of zero equals 1, 1 is 2, etc. Given a maximum dwell of 1023 the
following 16 bit unsigned integer represents a dwell of 1000 and a run length
of 32.
011111 1111101000
7FE8 hex
When an image is being displayed and the unsigned integer above is read, a
line of 32 pixels will be drawn using the appropriate color from the active
color mask for dwell value 1000.
Each line of a display is encoded with no wraparound. This means that each
line will end with the display of an encoded unsigned integer and no extra
pixels of the same dwell will be added for the beginning of the next line even
if there is room in the run length.
It should be noted that the maximum run length that can be stored varies
with the maximum dwell chosen. Files with a maximum dwell of 1023 will have a
maximum run length of 64, those with maximum dwells of 8191 will only store
16. This does not limit a run length because if it exceeds the space available
in a single unsigned integer it simply creates additional ones until the run
of dwells has been stored. For this reason images with high maximum dwell
values are often large in size. This method of file compression strikes a good
balance between file size and speed when displaying an image.
The Mathematics of the Mandelbrot Set
The Mandelbrot set is computed by operating on a fairly simple equation
that contains complex numbers of the form
x + yi where i = sqrt(-1)
The Mandelbrot equation is
z <- z^2 + c
where
z = x + yi and c = a + bi
substituting these values into z^2 + c we have
(x + yi)^2 + a + bi
x^2 + 2xyi - y^2 + a + bi
separating the real and imaginary parts of z gives
x <- x^2 - y^2 + a
y <- 2xy + b
To determine whether a point (a,b) in the complex plane is a member of the
Mandelbrot set, the real and imaginary parts of the equation are iterated. The
x and y values are first initialized to zero. The constants a and b, the point
in the plane, are then substituted into the equations giving
x <- a and y <- b
for the first iteration.
The two new values for x and y, along with the constants a and b, are now
substituted into the equations again. This procedure (iteration) continues
until the absolute value of x + yi > 2, ie. sqrt(x^2 + ^y2) > 2. For those
cases where this value never exceeds 2, the maximum number of iterations is
preset. A value of about 500 is usually adequate, although this value is
raised to several thousand when smaller details at high magnification are
examined. The number of times the equations are iterated before the value of
sqrt(x^2 + y^2) > 2 is called the dwell. Those initial points (a,b) where the
dwell is infinite, or for more practical purposes attains the preset maximum,
are members of the Mandelbrot set. Another way to describe this is to say that
for points within the Mandelbrot set, the sequence of points produced by this
iteration procedure is bounded inside a circle of radius 2, where points
outside the set are unbounded and continue to grow and escape the circle.
The Mandelbrot set exists entirely within the area defined by
-2 <= a <= 2 and -2 <= b <= 2
in the complex plane. A Mandelbrot image is produced by taking this area of
the complex plane and dividing it into a array of 1200 x 1200 points. Each one
of these points becomes the constant (a,b). The iteration procedure previously
described is used on each of the 1.44 million points, coloring each point in
the Mandelbrot set black and all others white. The algorithm is:
maxcount <- 1000
for b <- 2 to -2 stepdown 1/300
for a <- -2 to 2 step 1/300
x <- 0
y <- 0
count <- 0
while sqrt(x^2 + y^2) < 2 and count < maxcount
x <- x^2 - y^2 + a
y <- 2*x*y + b
count <- count + 1
end while
if count = maxcount plot(a,b,BLACK)
else plot(a,b,WHITE)
end for a
end for b
While the algorithm is not that complex, the amount of computation is
enormous. Depending on programming language and style, the inner loop has at
least four multiplications and a square root. For a point in the Mandelbrot
set this loop is executed 1000 times and there are over a million points to
check! It is not surprising that the Mandelbrot set was not discovered until
the age of computers.
In the Mandelbrot/Julia Set Generator program some additional refinements
are made to standardize the initial parameters used to generate a specific
image. Instead of defining the range of (a,b) values used for an area, a
center point and a magnification are specified. The center point is simply a
chosen (a,b) value. The length of a side which encloses the area of interest
is defined as
side = 2/magnification
The following values can now be defined
a_minimum = a_center - side/2
b_maximum = b_center + side/2
gap = side/width
where width is defined as the number of points that make up a side (or on a
computer screen the number of pixels), and the gap being the distance between
each point.
The Mandelbrot set is an interesting image, a sort of cardioid with a
spiked head attached at the left. The boundary of the set sprouts self similar
buds of different sizes. Vastly more interesting images are forthcoming when
we examine the boundary of the Mandelbrot set under higher magnification. To
obtain higher magnifications we simply divide a smaller area into our array of
points. For example, the area defined by the center point (-0.77,0.17) and
magnification 20 is located in the upper valley between the head and the
cardioid shaped body.
If we continue with these magnifications, very different and interesting
images can be produced by coloring the dwell values in specific ways. Along
with coloring points in the Mandelbrot set black, we can assign different
colors to other points based upon their dwell value. For example, we might
assign yellow to dwell values in the range 400 to 499, red to 300 to 399, etc.
When we do this a great deal more detail begins to appear in the boundary
regions. This region of interest exists only in a narrow band just outside the
Mandelbrot set. The skill one uses in choosing the various colors for
differing dwell values is very important when attempting to produce an
attractive image.
The Mandelbrot/Julia Set Generator uses a file called a color mask to
store the colors used in painting the various dwell values in an image. This
technique allows many different coloring schemes for a single image. Consider
the following color mask:
Dwell Range Odd Color Even Color
----------------------------------------------
0 9 blue white
10 19 red red
20 510 yellow yellow
511 511 black black
-1
Dwell values from 0 to 9 will be colored blue if they are odd numbers and
white if they are even. Values from 10 to 19 will be colored red, 20 to 510
yellow and 511 will be colored black. Choosing the maximum dwell value to be
in the set 2n - 1 maximizes the file compression method the Mandelbrot/Julia
Set Generator program uses.
Generating Julia set images is a similar process. The point (a,b) is
chosen from one of the interesting boundary areas of the Mandelbrot set. This
value is held constant and the (x,y) value is initialized to the various
points in the complex plane defined by
-2 <= x <= 2 and -2 <= y <= 2
This would be a magnification of 0.5, actually the Julia image can often
be enlarged slightly to fill the screen and magnifications from 0.6 to 0.9 are
often used.
The algorithm for generating a Julia set is
maxcount <- 1000
a <- constant
b <- constant
for y <- 2 to -2 stepdown 1/300
for x <- -2 to 2 step 1/300
count <- 00
while sqrt(x^2 + y^2) < 2 and count < maxcount
x <- x^2 - y^2 + a
y <- 2*x*y + b
count <- count + 1
end while
if count = maxcount plot(a,b,BLACK)
else plot(a,b,WHITE)
end for x
end for y
Selected References
Barnsley, Michael, Fractals Everywhere. San Diego, CA: Academic Press, 1988.
Briggs, John and Peat, F. David Turbulent Mirror. New York: Harper & Row,
1989.
Devaney, Robert L.Choas, Fractals, and Dynamics. Menlo Park, CA:Addison-
Wesley, 1990.
Devaney, Robert L. and Keen, Linda, Editors. Chaos and Fractals, The
Mathematics Behind the Computer Graphics: Proceedings of Symposia in
Applied Mathematics.Providence, RI: American Mathematical Society, 1989.
Gleick, James Chaos, Making a New Science. New York: Viking Penguin, Inc.,
1987.
Mandelbrot, Benoit B. The Fractal Geometry of Nature. New York: W. H. Freeman
and Co., 1983.
Peitgen, Heinz-Otto and Richter, Peter H. The Beauty of Fractals, Images of
Complex Dynamical Systems. Berlin: Springer-Verlag, 1986.
Peitgen, Heinz-Otto and Saupe, Dietmar, Editors. The Science of Fractal
Images. New York: Springer-Verlag, 1988.
Pietgen, Heinz-Otto, Jurgens, Hartmut and Saupe, Dietmar Fractals for the
Classroom, (Volumes I & II), New York: Springer-Verlag, 1992. (There is a
single volume work entitled Chaos and Fractals, New Frontiers of Science,
which is essentially the same work as the two volume set above.)
Pickover, Clifford A. Computers Pattern Chaos and Beauty: Graphics from an
Unseen World.New York: St. Martin's Press, 1990.
Pickover, Clifford A. Computers and the Imagination: Visual Adventures Beyond
the Edge. New York: St. Martin's Press, 1991.
Pickover, Clifford A. Mazes for the Mind. New York: St. Martins Press, 1992.
Schroeder, Manfred Fractals, Chaos, Power Laws, Minutes from an Infinite
Paradise.New York: W.H. Freeman and Co., 1991.
Stevens, Roger T. Fractal Programing in C. Redwood City, CA: M&T Publishing,
Inc., 1989.
Stevens, Roger T. Advanced Fractal Programing in C. Redwood City, CA: M&T
Publishing, Inc., 1990.
Stewart, Ian Does God Play Dice? The Mathematics of Chaos. Oxford: Basil
Blackwell, 1989.
Stewart, Ian and Golubitsky, Martin Fearful Symmetry, Is God a Geometer?
Oxford: Blackwell, 1992.
Registration
You may freely copy and distribute this shareware Version 5.6 of the
Mandelbrot/Julia Set Generator. Shareware users who find the Mandelbrot/Julia
Set Generator useful should support the author and register their copy. The
form found below should be used for registration. Registered users will
receive a copy of the newest version of the Mandelbrot/Julia Set Generator
with additional images and a printed manual. Registered users will also
receive support, by letter mail, e-mail or phone, for one year from the date
of registration.
The Mandelbrot/Julia Set Generator is a "shareware program" and is
provided at no charge to the user for evaluation. Vendors who distribute
shareware programs may charge a small fee for an evaluation copy. Feel free to
share this program with your friends, but please do not give it away altered
or as part of another system. The essence of "user-supported" software is to
provide personal computer users with quality software without high prices, and
yet to provide incentive for programmers to continue to develop new products.
If you find this program useful and find that you are using the
Mandelbrot/Julia Set Generator and continue to use the Mandelbrot/Julia Set
Generator after a reasonable trial period, you must make a registration
payment of $25. plus $2. shipping to Theron Wierenga. The registration fee
will license one copy for use on any one computer at any one time. You must
treat this registered software just like a book. An example is that this
registered software may be used by any number of people and may be freely moved
from one computer location to another, so long as there is no possibility of
it being used at one location while it's being used at another. Just as a book
cannot be read by two different persons at the same time.
The registration fee is $25. ($35. outside the United States.) Please
include $2.00 for shipping and handling. A complete listing of the program,
which is written in Borland C/C++, is also available for an additional $20.00.
All prices are in U.S. dollars.
Checks should be made out to:
Theron Wierenga, P.O. Box 595, Muskegon, MI 49443
Ombudsman Statement
This program is produced by a member of the Association of Shareware
Professionals (ASP). The ASP wants to make sure that the shareware principle
works for you. If you are unable to resolve a shareware-related problem with
an ASP member by contacting the member directly, ASP may be able to help. The
ASP Ombudsman can help you resolve a dispute or problem with an ASP member,
but does not provide technical support for members' products. Please write to
the ASP Ombudsman at 545 Grover Road, Muskegon, MI 49442-9427 USA, FAX 616-
788-2765 or send a CompuServe message via CompuServe Mail to ASP Ombudsman
70007,3536.
User Support
Registered users will receive support, by letter mail, e-mail or phone,
for one year from the date of registration on any problems they encounter.
Customer support and order phone 847-854-0489. The author is available by e-
mail on the internet at twiereng@remc4.k12.mi.us.
Registration Form
Mandelbrot/Julia Set Generator, Version 5.6
Name____________________________________________________________
Address_________________________________________________________
City_______________________________________State_____Zip________
Email address (if available)____________________________________
Disk size desired: 5 1/4 in._______ 3 1/2 in._______
Registration fee . . . . . . . . . . . . . . . $25.00 __________
Registration fee (Outside the USA) . . . . . . 35.00 __________
Borland C/C++ program code . . . . . . . . . . 20.00 __________
Shipping . . . . . . . . . . . . . . . . . . . ___2.00___
Total enclosed . . . . . . . . . . . . . . . . __________
(All prices are in U.S. dollars.)
Method of payment: Check or MO______ MasterCard______ Visa______
Account number____________________________ Expir. date__________
Signature (necessary)___________________________________________
How did you receive your copy of this program?__________________
________________________________________________________________
Suggested improvements__________________________________________
________________________________________________________________
________________________________________________________________
________________________________________________________________
The Mandelbrot/Julia Set Generator, Version 5.6
is a software product of
Theron Wierenga, P.O. Box 595, Muskegon, MI 49443
Customer support and order phone 847-854-0489
twiereng@remc4.k12.mi.us